/*************************************************
  * 描述：姓名转结构体信息私有实现类
  *
  * File：nameconverter_p.h
  * Author：gaomaolong@mozihealthcare.cn
  * Date：2025-09-18
  * Update：
  * ************************************************/
#ifndef NAMECONVERTER_P_H
#define NAMECONVERTER_P_H

#include <QPair>
#include <common/nameconverter/nameconverter.h>
#include <functional>
class PinyinConverter;

// 姓名解析函数
using NameParser = std::function<QPair<QString, QString>(const QString& name)>;

class NameConverterPrivate
{

public:
	/**
	 * 将中文姓名转换为姓名信息结构体
	 * @param name 中文姓名字符串
	 * @param ethnicity 民族枚举
	 * @return 包含姓名各部分信息的 NameInfo 结构体
	 * @warning 如果拼音转换失败，相关字段可能为空
	 */
	static NameInfo cvt2NameInfo(const QString& name, Ethnicity ethnicity);

private:
	/**
	 * 根据surname和personalName，构造NameInfo结构体
	 * @param surname 中文"姓"
	 * @param personalname 中文的“名 ”
	 * @return
	 */
	static NameInfo constructNameInfo(const QString& surname, const QString& personalname);

	/**
	 * 检验名字是否合法
	 * @param text 检查的中文字符串
	 * @return
	 */
	static bool validateName(const QString& text);

	/**
	 * 根据民族名称获取命名规则函数
	 * @param ethnicity 民族枚举
	 * @return 命名函数，该函数返回一个pair，pair.first为姓氏，pair.second为名字
	 */
	static NameParser getNamingRuleByEthnicity(Ethnicity ethnicity);

	/**
	 * 处理汉字转拼音逻辑
	 * @param fieldName 字段名称
	 * @param pinyinConverter 拼音转换器
	 */
	static QString parseFirstCell(const QString& fieldName, const PinyinConverter& pinyinConverter);

	//汉族命名规则 ，不带·
	static QPair<QString, QString> parseHanStyleName(const QString& name);

	// 姓后置解析逻辑，带符号·（名·姓）
	static QPair<QString, QString> parseLastNameWithDot(const QString& name);

	// 姓前置解析逻辑，带符号·，（姓·名）
	static QPair<QString, QString> parsePrefixWithDot(const QString& name);

	// 姓前置解析逻辑，可能带符号·,也可能不带（姓·名）（姓名）
	static QPair<QString, QString> parsePrefixMayWithDot(const QString& name);

	//只有名字，没有姓氏
	static QPair<QString, QString> parseAllNameStyle(const QString& name);

	//名字+父称+姓氏：俄罗斯族 带两个·
	static QPair<QString, QString> parseSpecial(const QString& name);
};


#endif//NAMECONVERTER_P_H
